package com.dsd.datav;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.dsd.datav.domain.Datavsmap;
import com.dsd.datav.utils.FileUtil;
import com.fasterxml.jackson.databind.node.DecimalNode;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

import static org.apache.xmlbeans.impl.piccolo.xml.Piccolo.STRING;

/**
 * @author Administrator
 * @Title: Random
 * @ProjectName datavf
 * @Description: TODO
 * @date 2024/3/27 00272024/3/27 0027
 */
@SpringBootTest
public class RandomNums {
    @Test
    public void getRandomLongitude(){
         double min =103.64109681;  // 指定范围的最小值
         double max = 103.649944001; // 指定范围的最大值
        double randomValue = min + (Math.random() * (max - min));
        // 保留八位小数
        String result = String.format("%.8f", randomValue);
        System.out.println("生成的随机八位小数在指定范围 [" + min + ", " + max + "] 内为: " + result);
    }
    @Test
    public void getShuLouRandomLatitude(){
        double min =28.607929174;  // 指定范围的最小值
        double max =28.621128793; // 指定范围的最大值
        double randomValue = min + (Math.random() * (max - min));
        // 保留八位小数
        String result = String.format("%.9f", randomValue);
        System.out.println("生成的随机八位小数在指定范围 [" + min + ", " + max + "] 内为: " + result);
    }
    @Test
    public void simpleRead() {
        String filePath = "src/main/resources/20240328.xlsx";
        List<Datavsmap> apiInfos = readExcel(filePath, 0, Datavsmap.class);
        for (Datavsmap datavsmap : apiInfos) {
            System.out.println(datavsmap);
        }
    }
    /**
     *
     * @param filePath Excel文件路径
     * @param sheetIndex 对应的表单，从0开始，0代表第一个表单
     * @param clazz 对应封装的数据实例对象
     * @return 返回数据集合
     */
    public static  List<Datavsmap> readExcel(String filePath, int sheetIndex, Class clazz) {
        // 定义输入流
        FileInputStream fis = null;
        List<Datavsmap> datas = null;
        try {
            // 创建输入流对象
            fis = new FileInputStream(filePath);
            // 创建一个easypoi使用的配置类
            ImportParams params = new ImportParams();
            // 设置表格坐标
            params.setStartSheetIndex(sheetIndex);
            // 读取数据
            datas = ExcelImportUtil.importExcel(fis, clazz, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return datas;
    }
    /**
     * 最简单的读
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link}
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link}
     * <p>
     * 3. 直接读即可
     */

    public List<Datavsmap> simpleRead2() {
        // 写法1：JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        String fileName = FileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        String filePath = "src/main/resources/20240329.xlsx";
        List<Datavsmap> datavsmaps=null;
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(filePath, Datavsmap.class, new PageReadListener<Datavsmap>(dataList -> {
            for (Datavsmap demoData : dataList) {
                datavsmaps.add(demoData);
            }
        })).sheet().doRead();
         return datavsmaps;
    }
    @Test
    public void write(){
        String filePath = "src/main/resources/20240329.xlsx";
        /*EasyExcel.write(filePath, Datavsmap.class).sheet("Sheet1").doWrite(longitude());*/
    }
    @Test
    public void longitude(){
        List<Datavsmap> datavsmaps = simpleRead2();
        for (Datavsmap datavsmap : datavsmaps) {
            System.out.println(datavsmap);
        }
    }
}
